//
//  PhotoBrowserCell.swift
//  weibo
//
//  Created by 张宏芝 on 15/9/14.
//  Copyright © 2015年 kama. All rights reserved.
//

import UIKit
import SDWebImage
import SVProgressHUD

 /// 照片Cell的协议
protocol PhotoBrowserCellDelegate:NSObjectProtocol{
//    高度控制器被缩放的比例
    func photoBrowserCellDidZooming(scale:CGFloat)
//    告诉控制器缩放完成
    func photoBrowserCellEndZoom()
}

// 显示单张图片.照片浏览cell
class PhotoBrowserCell: UICollectionViewCell {
    
//    照片缩放的代理
    weak var photoDelegate:PhotoBrowserCellDelegate?
    
/// 图像的URL
    var url:NSURL?{
        didSet{
            print(url)
            
//            重置ScrollView
            resetScrollView()
            
//        打开指示器
            indicator.startAnimating()
            imageView.image = nil
       
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0 * NSEC_PER_SEC)), dispatch_get_main_queue()) {
                /// 之前的imageView没有指定大小
                // * RetryFailed 可以允许失败后重试
                // * RefreshCached 如果服务器的图像变化，而本地的图像是之前的图像，使用此选项，会更新服务器的图片
                //   GET 方法能够缓存，如果服务器返回的状态吗是 304，表示内容没有变化
                //   提交请求，如果是 304，就使用本地缓存，否则使用服务器返回的图片，具体内容看`网络视频`
                
                self.imageView.sd_setImageWithURL(self.url, placeholderImage: nil, options: [SDWebImageOptions.RetryFailed,SDWebImageOptions.RefreshCached]) { (image, error, _, _) -> Void in
        
                self.indicator.stopAnimating()
        
                //  执行到此处,图片已经下载完成
                if error != nil{
                    SVProgressHUD.showInfoWithStatus("您的网络不给力")
                    return
                }
        
                /// 长短图的计算
                    self.setImagePosition()
                }
            }
        }
    }
    
//    重置scrollView的内容属性,因为缩放会影响到内容的属性
    private func resetScrollView(){
        scrollView.contentSize = CGSizeZero
        scrollView.contentInset = UIEdgeInsetsZero
        scrollView.contentOffset = CGPointZero
        
//        重置设置imageView形变属性
        imageView.transform = CGAffineTransformIdentity
    }

//    设置图像的位置
    //  如果图像缩放之后,没有屏幕那么宽,就显示在中间
    //  否则,显示在顶部,contentSize允许滚动
    private func setImagePosition(){
        let size = displaySize(imageView.image!)
        
        imageView.frame = CGRect(origin: CGPointZero, size: size)
        
        // 如果是短图
        if size.height < scrollView.bounds.height{
            let y = (scrollView.bounds.height - size.height) * 0.5
//            imageView.frame = CGRect(x: 0, y: y, width: size.width, height: size.height)
            
//            设置边距的最大好处,缩放以后,可以自动的调整contentSize,保证滚动看到边界
            scrollView.contentInset = UIEdgeInsets(top: y, left: 0, bottom: 0, right: 0)
        } else {
            
            // 如果是长图
//            imageView.frame = CGRect(origin: CGPointZero, size: size)
            scrollView.contentSize = size
        }
    }
//    按照scrollView的宽度,计算缩放后的比例
    private func displaySize(image:UIImage)->CGSize{
        let scale = image.size.height / image.size.width
        let w = scrollView.bounds.width
        let h = w * scale
        return CGSize(width: w, height: h)
    }
//    MARK:构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        printLog(frame)
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI(){
//        1.添加控件
        contentView.addSubview(scrollView)
        scrollView.addSubview(imageView)
        contentView.addSubview(indicator)
        
//        2.设置位置
//        scrollView.frame = bounds
        var rect = bounds
        rect.size.width -= 20
        scrollView.frame = rect
        
        indicator.center = scrollView.center
        
//        图片缩放代理
        preparScrollView()
    }
    
//    准备scrollView
    private func preparScrollView(){
        scrollView.delegate = self
    //   设置最大与最小的缩放比例
        scrollView.minimumZoomScale = 0.5
        scrollView.maximumZoomScale = 2.0
    }
    
//    MARK:懒加载
    /// 缩放图片
    private lazy var scrollView = UIScrollView()
    /// 显示单张图片
    lazy var imageView : UIImageView = {
        
        let iv = UIImageView()
        iv.contentMode = UIViewContentMode.ScaleAspectFill
        iv.clipsToBounds = true
        return iv
    }()
    
//    网络指示器
    private lazy var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
    
}

//  MARK:UIScrollViewDelegate
extension PhotoBrowserCell:UIScrollViewDelegate{
    
//    设置要缩放的视图是哪一个
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    /// 缩放完成后被调用
    ///
    /// - parameter scrollView: scrollView
    /// - parameter view:       被缩放的视图
    /// - parameter scale:      scale缩放完成的比例
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        print(view)
        print(scale)
        
//        调整X与Y的值
        var offsetY = (scrollView.bounds.height - imageView.frame.height) * 0.5
        var offsetX = (scrollView.bounds.width - imageView.frame.width) * 0.5
//        当超出范围的时候,就会进行调整
        offsetY = (offsetY < 0) ? 0 :offsetY
        offsetX = (offsetX < 0) ? 0 :offsetX
        
//        重新设置间距
        scrollView.contentInset = UIEdgeInsets(top: offsetY, left: offsetX, bottom: 0, right: 0)
//        通知代理缩放完成
        photoDelegate?.photoBrowserCellEndZoom()

    }
    
    /// 只要有缩放,就会被调用
    ///
    /// - parameter scrollView: scrollView
    func scrollViewDidZoom(scrollView: UIScrollView) {
//        通知代理缩放比例
        photoDelegate?.photoBrowserCellDidZooming(imageView.transform.a)
    }
}



















































